import { NextRequest, NextResponse } from 'next/server';

// 面试岗位的提示词配置
const INTERVIEW_SYSTEM_PROMPTS = {
  'java-backend': `你是一位经验丰富的Java后端开发技术面试官，专注于评估候选人在Spring Boot、微服务架构、数据库设计和Java核心技术方面的能力。
请根据候选人的回答进行严谨而专业的技术面试，提出具有挑战性但合理的问题。遵循以下面试流程：
1. 首先询问候选人的技术背景和项目经验
2. 针对Java核心概念（如并发、集合、JVM等）进行提问
3. 深入Spring Boot和微服务相关的技术问题
4. 提出1-2个数据库设计或性能优化相关的问题
5. 可以提出一个简单的编码问题或架构设计问题

你需要逐步提问，根据候选人的回答调整难度，每次提出1-2个问题，不要一次性提出所有问题。整个面试应该包含8-10个技术问题。
在面试过程中，请保持专业、客观和友好的态度，给予真实的技术反馈。面试持续约10-15个回合后，可以礼貌地结束面试。`,

  'frontend': `你是一位资深的Web前端开发技术面试官，负责评估候选人在React/Vue框架、JavaScript深度理解、前端性能优化等方面的能力。
请根据候选人的回答进行严谨而专业的技术面试，提出具有挑战性但合理的问题。遵循以下面试流程：
1. 首先询问候选人的技术背景和项目经验
2. 针对JavaScript核心概念（如闭包、原型链、异步编程等）进行提问
3. 深入React或Vue框架相关的技术问题（根据候选人的技术栈选择）
4. 提出1-2个前端性能优化或用户体验相关的问题
5. 可以提出一个简单的CSS布局或JavaScript编码问题

你需要逐步提问，根据候选人的回答调整难度，每次提出1-2个问题，不要一次性提出所有问题。整个面试应该包含8-10个技术问题。
在面试过程中，请保持专业、客观和友好的态度，给予真实的技术反馈。面试持续约10-15个回合后，可以礼貌地结束面试。`,

  'devops': `你是一位经验丰富的DevOps/运维技术面试官，专注于评估候选人在CI/CD流程设计、容器化部署、监控告警体系搭建等运维方面的能力。
请根据候选人的回答进行严谨而专业的技术面试，提出具有挑战性但合理的问题。遵循以下面试流程：
1. 首先询问候选人的技术背景和项目经验
2. 针对Linux系统管理和网络知识进行提问
3. 深入Docker、Kubernetes等容器技术相关的问题
4. 提出1-2个CI/CD流程设计或自动化运维相关的问题
5. 可以提出一个监控系统搭建或故障排查的场景问题

你需要逐步提问，根据候选人的回答调整难度，每次提出1-2个问题，不要一次性提出所有问题。整个面试应该包含8-10个技术问题。
在面试过程中，请保持专业、客观和友好的态度，给予真实的技术反馈。面试持续约10-15个回合后，可以礼貌地结束面试。`,

  'python-backend': `你是一位资深的Python后端开发技术面试官，专注于评估候选人在Django/Flask框架、Python语言特性、API设计和后端架构方面的能力。
请根据候选人的回答进行严谨而专业的技术面试，提出具有挑战性但合理的问题。遵循以下面试流程：
1. 首先询问候选人的技术背景和项目经验
2. 针对Python语言特性（如装饰器、生成器、元类等）进行提问
3. 深入Django或Flask框架相关的技术问题
4. 提出1-2个API设计或数据处理相关的问题
5. 可以提出一个简单的编码问题或后端架构设计问题

你需要逐步提问，根据候选人的回答调整难度，每次提出1-2个问题，不要一次性提出所有问题。整个面试应该包含8-10个技术问题。
在面试过程中，请保持专业、客观和友好的态度，给予真实的技术反馈。面试持续约10-15个回合后，可以礼貌地结束面试。`,

  'security': `你是一位资深的网络安全工程师技术面试官，专注于评估候选人在安全漏洞识别、渗透测试、安全防护方案设计等网络安全方面的能力。
请根据候选人的回答进行严谨而专业的技术面试，提出具有挑战性但合理的问题。遵循以下面试流程：
1. 首先询问候选人的技术背景和项目经验
2. 针对常见Web安全漏洞（如XSS、CSRF、SQL注入等）进行提问
3. 深入渗透测试方法和工具相关的问题
4. 提出1-2个安全架构设计或加密技术相关的问题
5. 可以提出一个安全事件响应或风险评估的场景问题

你需要逐步提问，根据候选人的回答调整难度，每次提出1-2个问题，不要一次性提出所有问题。整个面试应该包含8-10个技术问题。
在面试过程中，请保持专业、客观和友好的态度，给予真实的技术反馈。面试持续约10-15个回合后，可以礼貌地结束面试。`,

  'mobile': `你是一位资深的移动端开发技术面试官，专注于评估候选人在Android/iOS原生开发或跨平台开发、性能优化与用户体验方面的能力。
请根据候选人的回答进行严谨而专业的技术面试，提出具有挑战性但合理的问题。遵循以下面试流程：
1. 首先询问候选人的技术背景和项目经验
2. 针对移动端开发平台特性（如Android生命周期、iOS内存管理或Flutter架构等）进行提问
3. 深入UI组件、状态管理或网络请求相关的技术问题
4. 提出1-2个移动端性能优化或用户体验相关的问题
5. 可以提出一个简单的移动端架构设计或功能实现问题

你需要逐步提问，根据候选人的回答调整难度，每次提出1-2个问题，不要一次性提出所有问题。整个面试应该包含8-10个技术问题。
在面试过程中，请保持专业、客观和友好的态度，给予真实的技术反馈。面试持续约10-15个回合后，可以礼貌地结束面试。`
};

// 转换消息格式为DeepSeek API需要的格式
function formatMessagesForDeepSeek(messages: any[]) {
  return messages.map((msg) => ({
    role: msg.role,
    content: msg.content
  }));
}

export async function POST(req: NextRequest) {
  try {
    const { position, userInfo, messages } = await req.json();
    
    // 验证必需参数
    if (!position || !userInfo || !messages || !Array.isArray(messages)) {
      return NextResponse.json(
        { error: '缺少必要参数' },
        { status: 400 }
      );
    }
    
    // 获取对应岗位的系统提示词
    const systemPrompt = INTERVIEW_SYSTEM_PROMPTS[position as keyof typeof INTERVIEW_SYSTEM_PROMPTS] || INTERVIEW_SYSTEM_PROMPTS['java-backend'];
    
    // 添加用户简历信息到系统提示词
    const resumeInfo = `候选人信息：
姓名：${userInfo.name}
学历：${userInfo.education}
工作经验：${userInfo.years}年
技术技能：${userInfo.skills.join('、')}
自我介绍：${userInfo.selfIntro}

基于以上信息，进行有针对性的技术面试。`;
    
    const enhancedSystemPrompt = systemPrompt + '\n\n' + resumeInfo;
    
    // 格式化消息
    const formattedMessages = formatMessagesForDeepSeek(messages);
    
    // 判断是否需要结束面试
    // 如果消息数量超过20条或对话已经进行了10轮以上
    const roundCount = Math.floor(messages.length / 2);
    const shouldEndInterview = roundCount >= 12;

    // 添加面试剩余情况的提示
    let interviewStatusPrompt = '';
    if (roundCount >= 10) {
      interviewStatusPrompt = `\n\n注意：面试即将接近尾声，请在1-2个回合内礼貌地结束面试，并告知候选人面试已结束。`;
    } else if (roundCount >= 7) {
      interviewStatusPrompt = `\n\n注意：面试已进行了${roundCount}轮，请继续深入技术问题，为最后的评估做准备。`;
    }
    
    // DeepSeek API请求
    try {
      // 使用实际的 DeepSeek API 配置
      const DEEPSEEK_API_KEY = "sk-dbc2528168b542acbf58df81f0c3db88";
      const DEEPSEEK_API_ENDPOINT = 'https://api.deepseek.com/v1/chat/completions';
      
      const response = await fetch(DEEPSEEK_API_ENDPOINT, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${DEEPSEEK_API_KEY}`,
        },
        body: JSON.stringify({
          model: 'deepseek-chat',
          messages: [
            {
              role: 'system',
              content: enhancedSystemPrompt + interviewStatusPrompt
            },
            ...formattedMessages
          ],
          temperature: 0.7,
          max_tokens: 1000
        }),
      });
      
      // 如果DeepSeek API调用成功
      if (response.ok) {
        const data = await response.json();
        const aiResponse = data.choices[0].message.content;
        
        // 判断AI回复是否暗示面试结束
        const interviewEndingPhrases = [
          "今天的面试就到这里",
          "面试环节已经结束",
          "结束今天的面试",
          "今天的面试已经完成",
          "感谢您参与本次面试"
        ];
        
        const isEndingInterview = shouldEndInterview || 
          interviewEndingPhrases.some(phrase => aiResponse.includes(phrase));
        
        return NextResponse.json({
          response: aiResponse,
          isInterviewEnded: isEndingInterview
        });
      } else {
        // 如果API调用失败
        console.error('DeepSeek API调用失败:', await response.text());
        
        // 使用模拟数据进行响应
        return NextResponse.json({
          response: '抱歉，我在处理您的回答时遇到了问题。请问您能否更详细地解释一下您的技术背景？',
          isInterviewEnded: false
        });
      }
    } catch (error) {
      console.error('调用DeepSeek API时发生错误:', error);
      
      // 使用模拟数据进行响应
      return NextResponse.json({
        response: '抱歉，我在处理您的回答时遇到了问题。请问您能否再详细说明一下您的技术经验？',
        isInterviewEnded: false
      });
    }
    
  } catch (error) {
    console.error('处理请求时发生错误:', error);
    return NextResponse.json(
      { error: '服务器内部错误' },
      { status: 500 }
    );
  }
} 